package com.hfb.mashibing.alip8.juc.c020_01_interview.A1B2C3;
/**
 *  互联网一线大厂面试题：
 *      徒手写出：2个不同的线程，交替输出A1B2C3。。。
 *
 * 线程排序问题
 * 思路：利用 synchronized 和 volatile 的 flag，
 *      分别依次遍历字母队列和数字队列
 */
public class A1B2C3Synchronized {

    private static char[] charsLetter = "ABCDEFGHI".toCharArray();
    private static char[] charsNumber = "123456789".toCharArray();

    private static Object o = new Object();
    private static volatile boolean flag = false;


    public static void main(String[] args) {
        new Thread(()->{
            synchronized (o) {
                while (flag) {}
                for (int i = 0; i < charsLetter.length; i++) {
                    System.out.print(charsLetter[i]);
                    flag = true;
                    // 唤醒等待线程，只有2个线程，故这里唤醒的是另一个线程
                    o.notify();
                    try {
                        o.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println();
        }).start();

        new Thread(()->{
            synchronized (o) {
                while (!flag) {}
                for (int i = 0; i < charsNumber.length; i++) {
                    System.out.print(charsNumber[i]);
                    // 唤醒等待线程，只有2个线程，故这里唤醒的是另一个线程
                    o.notify();
                    try {
                        o.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }

}
